09.3 精通自定义 View 之 Canvas 与图层——Flag 的具体含义

返回自定义 View 目录

在 Canvas 中有如下几个 save 系列函数:

1
2
3
4
5
6
public int save()
public int save(int saveFlags)
public int saveLayer(RectF bounds, Paint paint, int saveFlags)
public int saveLayer(float left, float top, float right, float bottom,Paint paint, int saveFlags)
public int saveLayerAlpha(RectF bounds, int alpha, int saveFlags)
public int saveLayerAlpha(float left, float top, float right, float bottom,int alpha, int saveFlags)

可以看到,flag 参数在诸多函数中都有使用,这里我们先关注 save 的两个构造函数和 saveLayer 的两个构造函数。我们知道,二者的不同之处在于,saveLayer() 函数会新建一块画布,而 save() 函数则不会新建画布。它们都具有 Flag(标识),这些 Flag(标识)的含义和适用范围如下表所示。

Flag 含义 适用范围
ALL_SAVE_FLAG 保存所有的标识 save()、saveLayer()
MATRIX_SAVE_FLAG 仅保存 Canvas 的 matrix 数组 save()、saveLayer()
CLIP_SAVE_FLAG 仅保存 Canvas 的当前大小 save()、saveLayer()
HAS_ALPHA_LAYER_SAVE_FLAG 标识新建的 bmp 具有透明度,在与上层画布结合时,透明位置显示上图图像,与 FULL_COLOR_LAYER_SAVE_FLAG 冲突,若同时指定,则以 HAS_ALPHA_LAYER_SAVE_FLAG 为主 saveLayer()
FULL_COLOR_LAYER_SAVE_FLAG 标识新建的 bmp 颜色完全独立,在与上层画布结合时,先清空上层画布再覆盖上去 saveLayer()
CLIP_TO_LAYER_SAVE_FLAG 在保存图层前先把当前画布根据 bounds 裁剪,与 CLIP_SAVE_FLAG 冲突,若同时指定,则以 CLIP_SAVE_FLAG为主 saveLayer()

从上面的表格中可以看到,ALL_SAVE_FLAG、MATRIX_SAVE_FLAG、CLIP_SAVE_FLAG 是 save()、saveLayer() 函数共用的。而另外三个 Flag 是 saveLayer() 函数专用的。

我们逐个解析下它们的不同之处。在讲解之前,先考虑一下:如果让我们保存一块画布的状态,以便恢复,则需要保存哪些内容呢?

第一个是位置信息,第二个是大小信息,好像除此之外也没什么了。位置信息对应的是 MATRIX_SAVE_FLAG,大小信息对应的是 CLIP_SAVE_FLAG,这是 save() 和 saveLayer() 函数所共用的标识。而 saveLayer() 函数专用的三个标识用于指定 saveLayer() 函数新建的画布具有哪种特性,而不是保存画布的范畴。

注意:以上内容已过时,这些标志已在 API 28 中删除。带有 Flag 的构造函数在 API 26 被标为已过时,不建议使用。且新的不带 Flag 参数的构造函数默认指定标识为 ALL_SAVE_FLAG。详情请参见此处